# -*- encoding:utf-8 -*-
from datetime import datetime
# 公共的使用：数据库的db
from flask_sqlalchemy import SQLAlchemy as _SQLAlchemy  # 重新定义名称
from sqlalchemy import Column, Integer, SmallInteger
from contextlib import contextmanager


# 继承_SQLAlchemy
class SQLAlchemy(_SQLAlchemy):
    # 定义一个事务与事务回滚，在其他地方使用with 就能统一使用
    @contextmanager
    def auto_commit(self):
        try:
            yield   # 就是其他地方try里面要执行的代码
            self.session.commit()
        except Exception as e:
            db.session.rollback()
            raise e



db = SQLAlchemy()


class Base(db.Model):
    # 在这里写上这个，flask就不会以为这是一个表了，而是一个基类
    __abstract__ = True
    # 在里面写上default=datetime.now()所有的数据都是项目启动时间，因为这里的类变量是启动的时候就开始使用了，
    # 而在构造函数__init__里面, 只有在使用的时候才会创建当前时间
    create_time = Column('create_time', Integer)

    # 逻辑删除
    status = Column(SmallInteger, default=1)

    def __init__(self):
        # 创建数据的时候 create_time顺便创建了时间, .timestamp()时间戳
        self.create_time = int(datetime.now().timestamp())

    def set_attrs(self, attrs_dict):
        """
        :param attrs_dict: 字典， 遍历这个字典，这个字典的某个key和属性是相同的，我们就把这个字典key所对应 的值赋给模型的相关属性
        :return:
        """
        for key, value in attrs_dict.items():
            # 判断key是否和模型有相同的属性(字段)
             # 一个对象下是否包含某个属性
            if hasattr(self, key) and key != 'id':  # 有些属性我不想被赋值的，比如ID
                # 动态赋值， 哪个属性进行赋值，以key这个命名的属性来赋值， 那赋于什么值呢，就是value
                setattr(self, key, value)

    # 软删除
    def delete(self):
        self.status = 0



